Gremlinのシナリオを使ってTLS/SSL証明書の有効期限をテストしてみる。
カオスエンジニアリングのサービスであるGremlinには、シナリオという機能があります。
これはGremlinの攻撃とステータスチェックを合わせたもので、観測を簡単に記録したり、シナリオを編集して爆風半径と大きさを拡張したりして、 実験を繰り返すことができます。
あらかじめGremlinでは推奨シナリオというのがいくつか用意されており、そのまま実行したりカスタマイズして独自のシナリオとして作成できたりもします。
本記事では、その推奨シナリオで用意されているTest TLS/SSL certificate expiration
を使ってTLS/SSL証明書の有効期限をテストする方法を確認していきたいと思います、。
参考:
Gremlinのブログで説明されている内容を実際にやってみることにします。
やってみる
シナリオの説明
システムの時計を1日、1週間、1ヶ月前に進めることで、このテストを行うことができます。 このシナリオは、テストしたいTLSで暗号化されたサービスにアクセスするシステムに対して実行します。 証明書が有効でないためにシステムがサービスへの接続に失敗した場合、有効期限が間近に迫っていることがわかります。
時計を進めている間にWebサイトにアクセスして、どのような結果が返ってくるのかをテストすることになります。
必要なもの
テストしたいWebサイトと、 Gremlinのえージェンんとがインストールされたホストが1つ以上必要です。
また、Webサイトにアクセスするホストからのアクセスを確認するツールとして、curl
を利用したいと思います。
curl -I https://dev.classmethod.jp
シナリオの編集
Gremlinの管理コンソールにログインし、Scenarios
メニューからTest TLS/SSL certificate expiration
を検索します。
Recommendedのタブの配下に表示されます。
シナリオの詳細ページに遷移し,Customize
をクリックします、。
Time Travel
攻撃が3つリストされていますので、必要に応じて一つずつ編集していきます。
ターゲットホストの選択や、Time Travel
攻撃のプロパティを変更できます。
offsetを変更することでローカル時刻をずらす期間を変更することになります。
Time Travel
攻撃を追加したり、ステータスチェックを追加することもできるので、テストしたい内容に応じて変更しましょう。
本記事では、1時間後、1日後、1週間後、1年後 と順に時間をずらしていくことにしました
シナリオの実行とWebサイトにアクセスしてテストする
シナリオを実行し、実行中にチェックしたいWebサイトにアクセスしてみます。
実行が開始されると、攻撃の状況がわかるページが表示されます。
時計がずれている間のcurlの結果は
有効期限が切れていないとHTTP/2 200
が返ってきて、切れているとcurl: (60) SSL certificate problem: certificate has expired
というメッセージが返ってきて失敗します。
Gremlinのシナリオは終了し、今回の結果を入力するダイアログが起動します。
スクリプトにしてみる
手動でcurlを実行してテストしたらエラーとなりましたが、複数の証明書があったりして毎回手動でやるわけにも行かないので、
自動化してテストのサイクルに組み込める仕組みにしたらより便利になります。
Gremlinのシナリオを実行し、実行期間中にcurlを使ってアクセスを繰り返し、アクセスエラーだったらシナリオを中断する
といったことでいろんなサイトに使いまわしたり、結果の確認もしやすくなるのではないでしょうか・
GremlinはAPIがあるので、シナリオ実行もAPI経由で可能です。
RUN=$(curl -X POST 'https://api.gremlin.com/v1/scenarios/<your Scenario ID>/runs?teamId=<your team ID>' -H 'Content-Type: application/json;charset=utf-8' -H 'Authorization: Bearer <your bearer token>' -d '{}') while : do echo $(date) curl -I https://dev.classmethod.jp if [[ "$?" -ne 0 ]]; then break fi sleep 5 done curl -X POST 'https://api.gremlin.com/v1/scenarios/halt/<your Scenario ID>/runs/'$RUN'?teamId=<your team ID>' -H 'Content-Type: application/json;charset=utf-8' -H 'Authorization: Bearer <your bearer token>' -d '{}'
例えばこんな感じのスクリプトを用意して自動テストの仕組みに組み込んで定期的に動かすこともできるでしょう.
途中でエラーになった時のシナリオは、上記のように途中でhaltの状態になります。
最後に
Gremlinの推奨シナリオとして用意されているTLS/SSL証明書の有効期限をテストを利用してみました。
管理された環境下で安全にテストできるようになるのは良いですね。
定期的に時刻を進めるテストを実行することによっていつ証明書の有効期限が切れるのか、時刻同期がエラーした時の挙動も確認できそうです。